package es.unileon.rnag.jgen.operadores;

import java.util.*;
import es.unileon.rnag.jgen.*;

/**
 * Clase que implementa el operador de selecci&oacute;n por torneo
 * @author Abel Mayorga Gonz&aacute;lez
 * @author Sergio Fern&aacute;ndez Mart&iacute;nez
 * @version 1.0
 */
public class SeleccionTorneo extends Seleccion{
	
	/**
	 * Constructor
	 * @param porcentaje: Porcentaje de seleccionados en tanto por uno
	 */
	public SeleccionTorneo(float porcentaje){
		super(porcentaje);
	}
	
	@Override
	public List<Cromosoma> operar(int generacion, List<Cromosoma> poblacion){
		int elementos = poblacion.size();
		//numero de elementos seleccionados
		int n = (int)Math.floor(_porcentaje*elementos);
		List<Cromosoma> seleccionados = new ArrayList<Cromosoma>();
		for (int i=0; i<n; i++){
			//Se escogen dos cromosomas aleatoriamente y se escoge el mejor
			int e1 = (int)(Math.random()*elementos);
			int e2 = e1;
			while(e2==e1){
				e2 = (int)(Math.random()*elementos);
			}
			if(poblacion.get(e1).getAptitud()>poblacion.get(e2).getAptitud()){
				seleccionados.add(poblacion.get(e1).clonar());
			} else {
				seleccionados.add(poblacion.get(e2).clonar());
			}
		}
		return seleccionados;
	}
}
